Joi is a library that lets us validate an object’s structure with ease.
In this article, we’ll look at how to validate objects with Joi.
any
any
creates a schema that matches any data type:
const any = Joi.any();
await any.validateAsync('a');
failover
We can set a failover value if schema validation fails with failover
.
forbidden
forbidden
lets us mark a key as forbidden:
const schema = {
a: Joi.any().forbidden()
};
Now validation fails if a
is in our object.
id
The id
method lets us set the schema ID for getting the schema.
invalid
invalid
lets us mark invalid values:
const schema = {
a: Joi.any().invalid("a"),
b: Joi.any().invalid("b", "B")
};
label
label
lets us override the key name in error messages:
const schema = {
name: Joi.string().label("Name")
};
meta
meta
lets us add metadata to a key:
const schema = Joi.any().meta({ index: true });
note
note
adds notes to as individual arguments to annotate it:
const schema = Joi.any().note('this is special', 'this is important');
optional
optional
marks a key as optional:
const schema = Joi.any().optional();
prefs
prefs
lets us sets the validation options.
raw
raw
outputs the original untouched value instead of the casted value.
So if we have:
const rawTimestampSchema = Joi.date().timestamp().raw();
rawTimestampSchema.validate('12376834097810');
We validate the string instead of casting it to a Date
object.
required
required
make a key as required:
const schema = Joi.any().required();
ruleset
ruleset
lets us apply multiple rule options:
const schema = Joi.number().ruleset.min(1).max(20).rule({ message: 'Number must be between 1 and 20' });
shared
shared
registers a schema to be used by descendants of the schema in linked references.
If we have:
const schema = Joi.object({
a: [Joi.string(), Joi.link("#x")],
b: Joi.link("#type.a")
})
.shared(Joi.number().id("x"))
.id("type");
Then b
and x
is validated with the rules from a
strip
strip
marks a key to be removed from an object or array after validation to sanitize output:
const schema = Joi.object({
username: Joi.string(),
password: Joi.string().strip()
});
password
will be removed from the output if we validate against this schema.
tag
The tag
method annotated the key with tags:
const schema = Joi.any().tag('foo', 'bar');
tailor
tailor
returns a schema which is created by alter
:
const schema = Joi.object({
key: Joi.string().alter({
get: (schema) => schema.required(),
post: (schema) => schema.forbidden()
})
});
const getSchema = schema.tailor("get");
getSchema
would be the value of the get
property.
unit
unit
annotates the unit:
const schema = Joi.number().unit('milliseconds');
valid
valid
marks the valid values:
const schema = {
a: Joi.any().valid("a")
};
'a'
is the valid value of a
.
validate
validate
validates data with a schema:
const schema = Joi.object({
a: Joi.number()
});
const value = {
a: "123"
};
const result = schema.validate(value);
result
would be true
because value.a
is a number.
validateAsync
validateAsync
does the validation asynchronously.
It returns a promise which resolves to the validation result.
warning
warning
sets the warning:
const schema = Joi.any()
.warning('custom.x', { w: 'world' })
.message({ 'custom.x': 'hello {#w}!' });
const { value, error, warning } = schema.validate('anything');
#w
has the value of w
in the object we pass in.
Conclusion
We can customize our validation with warnings, references, and other annotations.